package com.ess.base.service;


import com.ess.result.ServiceResult;
import com.github.abel533.entity.Example;
import com.github.pagehelper.PageInfo;

import java.io.Serializable;
import java.util.List;

/**
 * 通用mapper api
 *
 * @param <T>
 */
public interface BaseService<T> {

    /**
     * 根据id查询数据
     *
     * @param id
     * @return
     */
    T queryById(Serializable id);

    /**
     * 根据id查询数据 返回结果包装
     *
     * @param id
     * @return
     */
    ServiceResult<T> queryByIdRes(Serializable id);

    /**
     * 查询所有数据
     *
     * @return
     */
    List<T> queryAll();

    /**
     * 查询所有数据  返回结果包装
     *
     * @return
     */
    ServiceResult<List<T>> queryAllRes();

    /**
     * 根据条件查询一条数据
     *
     * @param record
     * @return
     */
    T queryOne(T record);

    /**
     * 根据条件查询一条数据  返回结果包装
     *
     * @param record
     * @return
     */
    ServiceResult<T> queryOneRes(T record);

    /**
     * 根据条件查询数据列表
     *
     * @param record
     * @return
     */
    List<T> queryListByWhere(T record);


    /**
     * 根据条件查询数据列表 返回结果包装
     *
     * @param record
     * @return
     */
    ServiceResult<List<T>> queryListByWhereRes(T record);

    /**
     * 分页查询数据列表
     *
     * @param page
     * @param rows
     * @param record
     * @return
     */
    PageInfo<T> queryPageListByWhere(Integer page, Integer rows, T record);


    /**
     * 分页查询数据列表   返回结果包装
     *
     * @param page
     * @param rows
     * @param record
     * @return
     */
    ServiceResult<PageInfo<T>> queryPageListByWhereRes(Integer page, Integer rows, T record);

    /**
     * 分页查询用户信息 可以设置排序，模糊查询
     *
     * @param page
     * @param rows
     * @param record
     * @param example
     * @return
     */
    PageInfo<T> queryPageListByExample(int page, int rows, T record, Example example);


    /**
     * 分页查询信息 可以设置排序，模糊查询  返回结果包装
     *
     * @param page
     * @param rows
     * @param record
     * @param example
     * @return
     */
    ServiceResult<PageInfo<T>> queryPageListByExampleRes(int page, int rows, T record, Example example);

    /**
     * 分页查询信息 可以设置排序，模糊查询
     *
     * @param page
     * @param rows
     * @param record
     * @return
     */
    PageInfo<T> queryPageListByCondition(int page, int rows, T record);

    /**
     * 分页查询信息 可以设置排序，模糊查询  返回结果包装
     *
     * @param page
     * @param rows
     * @param record
     * @return
     */
    ServiceResult<PageInfo<T>> queryPageListByConditionRes(int page, int rows, T record);

    /**
     * 新增数据
     *
     * @param t
     * @return
     */
    Integer save(T t);


    /**
     * 新增数据  返回结果包装
     *
     * @param t
     * @return
     */
    ServiceResult<Integer> saveRes(T t);

    /**
     * 有选择的保存，选择不为null的字段作为插入字段
     *
     * @param t
     * @return
     */
    Integer saveSelective(T t);

    /**
     * 有选择的保存，选择不为null的字段作为插入字段  返回结果包装
     *
     * @param t
     * @return
     */
    ServiceResult<Integer> saveSelectiveRes(T t);

    /**
     * 更新数据
     *
     * @param t
     * @return
     */
    Integer update(T t);

    /**
     * 更新数据  返回结果包装
     *
     * @param t
     * @return
     */
    ServiceResult<Integer> updateRes(T t);

    /**
     * 有选择的更新，选择不为null的字段作为插入字段
     *
     * @param t
     * @return
     */
    Integer updateSelective(T t);


    /**
     * 有选择的更新，选择不为null的字段作为插入字段  返回结果包装
     *
     * @param t
     * @return
     */
    ServiceResult<Integer> updateSelectiveRes(T t);

    /**
     * 根据id删除数据
     *
     * @param id
     * @return
     */
    Integer deleteById(Serializable id);


    /**
     * 根据id删除数据  返回结果包装
     *
     * @param t
     * @return
     */
    ServiceResult<Integer> deleteByIdRes(Serializable id);

    /**
     * 批量删除
     *
     * @param clazz
     * @param property
     * @param values
     * @return
     */
    Integer deleteByIds(Class<T> clazz, String property, List<Object> values);


    /**
     * 批量删除  返回结果包装
     *
     * @param clazz
     * @param property
     * @param values
     * @return
     */
    ServiceResult<Integer> deleteByIdsRes(Class<T> clazz, String property, List<Object> values);

    /**
     * 根据条件删除数据
     *
     * @param record
     * @return
     */
    Integer deleteByWhere(T record);

    /**
     * 根据条件删除数据
     *
     * @param record
     * @return
     */
    ServiceResult<Integer> deleteByWhereRes(T record);


}
